﻿using DevExpress.XtraEditors;
using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace GUI.InsertDataCatalogTest
{
    using DAL.Entities;
    using BLL;
    using EXT;
    public partial class frmNhomchucnang : GUI.InsertDataCatalogTest.FrmInput
    {
        #region Fields
        string _name;
        DanhmucBLL Danhmuc_BLL;
        #endregion

        public frmNhomchucnang()
        {
            InitializeComponent();
            _name = Name.Replace("frm", "");
            Danhmuc_BLL = new DanhmucBLL();
        }

        protected override void PerformEdit()
        {
            var tmpId = gvNhomchucnang.GetFocusedRowCellValue("Id");
            if (tmpId == null)
            {
                XtraMessageBox.Show(STR_CHOICE_E,
                    Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            base.PerformEdit();
        }

        protected override void PerformDelete()
        {
            //var tmpId = gvNhomchucnang.GetFocusedRowCellValue("Id");
            //if (tmpId == null)
            //{
            //    XtraMessageBox.Show(STR_CHOICE,
            //        Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
            //    return;
            //}

            //var text = gvNhomchucnang.GetFocusedRowCellValue("Name");
            //var id = (Guid)tmpId;

            //if (id == new Guid())
            //    XtraMessageBox.Show(STR_SELECT.ToUpper(), STR_DELETE.ToUpper(),
            //    MessageBoxButtons.OK, MessageBoxIcon.Information);
            //else
            //{
            //    var cfm = String.Format(STR_CONFIRM, text);
            //    var oki = XtraMessageBox.Show(cfm.ToUpper(), STR_DELETE.ToUpper(), MessageBoxButtons.OKCancel);

            //    if (oki == DialogResult.OK)
            //        if (Danhmuc_BLL.Danhmuc_Delete_Update(id) != null) PerformRefresh();
            //        else XtraMessageBox.Show(STR_UNDELETE.ToUpper(), STR_DELETE.ToUpper(),
            //            MessageBoxButtons.OK, MessageBoxIcon.Warning);
            //}

            base.PerformDelete();
        }

        protected override void PerformRefresh()
        {
            LoadData();

            if (_dtb != null)
            {
                ClearDataBindings();
                if (_dtb.Rows.Count > 0) DataBindingControl();
            }

            ReadOnlyControl(true);

            base.PerformRefresh();
        }

        protected override void PerformSave()
        {
            if (!ValidInput())
            {
                return;
            }
            switch (_state)
            {
                case State.Add:
                    if (InsertObject())
                    {
                        ResetInput();
                        LoadData();
                        XtraMessageBox.Show("Lưu thành công!", "Lưu", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        txtName.Focus();
                    }
                    break;

                case State.Edit:
                    if (UpdateObject())
                    {
                        ChangeStatus(true);
                        ReadOnlyControl(true);
                        PerformRefresh();
                        XtraMessageBox.Show("Lưu thành công!", "Lưu", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    break;

                default:
                    break;
            }
            base.PerformSave();
        }

        protected override void ResetInput()
        {
            txtName.Text = null;
            txtNote.Text = null;
            base.ResetInput();
        }

        protected override void ClearDataBindings()
        {
            txtName.DataBindings.Clear();
            txtNote.DataBindings.Clear();
            base.ClearDataBindings();
        }

        protected override void DataBindingControl()
        {
            txtName.DataBindings.Add("EditValue", _dtb, ".Name");
            txtNote.DataBindings.Add("EditValue", _dtb, ".Note");
            base.DataBindingControl();
        }

        protected override void ReadOnlyControl(bool isReadOnly)// = true)
        {
            txtName.Properties.ReadOnly = isReadOnly;
            txtNote.Properties.ReadOnly = isReadOnly;

            gcNhomchucnang.Enabled = isReadOnly;

            base.ReadOnlyControl(isReadOnly);
        }

        protected override bool UpdateObject()
        {
            try
            {
                if (!ValidInput()) return false;

                var id = (Guid)gvNhomchucnang.GetFocusedRowCellValue("Id");

                var o = new Danhmuc()
                {

                };

                Danhmuc_BLL.Danhmuc_Update(o);
                return true;
            }
            catch { return false; }
        }

        protected override bool InsertObject()
        {
            try
            {
                if (!ValidInput()) return false;

                var o = new Danhmuc()
                {
                    Id = Guid.NewGuid(),
                    Id_Parent=Guid.Empty,
                    Kind=_name,
                    Name = txtName.Text.ToUpperFirst(),
                    NVal1=0,
                    NVal2=0,
                    SVal1="",
                    SVal2="",
                    Bval=true,
                    Note = txtNote.Text.ToUpperFirst(),
                    Show=true
                };

                Danhmuc_BLL.Danhmuc_Insert(o);
                return true;
            }
            catch { return false; }
        }

        protected override void LoadData()
        {
            _dtb = Danhmuc_BLL.Danhmuc_Select_By_Kind(_name);

            if (_dtb != null)
            {
                gcNhomchucnang.DataSource = _dtb;
                gvNhomchucnang.BestFitColumns();
            }

            base.LoadData();
        }

        protected override bool ValidInput()
        {
            if (txtName.Text.Trim() == "")
            {
                XtraMessageBox.Show("Cần tên nhóm chức năng trước", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return false;
            }
            if (Danhmuc_BLL.IsExists(new DAL.Entities.Danhmuc { Kind = _name, Name = txtName.EditValue.ToString().Trim() }))
            {
                XtraMessageBox.Show("Nhóm chức năng này đã tồn tại.\nVui lòng nhập nhóm chức năng mới", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return false;
            }
            return true;
        }

        protected override void PerformAdd()
        {
            txtName.Focus();
            base.PerformAdd();
        }

        #region Constants
        private const string STR_TITLE = "Nhóm chức năng";
        private const string STR_ADD = "Thêm " + STR_TITLE;
        private const string STR_EDIT = "Sửa " + STR_TITLE;
        private const string STR_DELETE = "Xoá " + STR_TITLE;

        private const string STR_SELECT = "Chọn dữ liệu!";
        private const string STR_CONFIRM = "Có nhóm chức năng '{0}' không?";
        private const string STR_UNDELETE = "Không xoá được!\nDữ liệu đang được sử dụng.";
        private const string STR_DUPLICATE = "Nhóm nhức năng này có rồi";

        //private const string STR_AGE = "Phải 18 tuổi trở lên!";
        //private const string STR_PASS = "Mật khẩu 6 kí tự trở lên!";

        private const string STR_CHOICE = "CHỌN DÒNG CẦN XOÁ\n\rHOẶC KHÔNG ĐƯỢC CHỌN NHÓM ĐỂ XOÁ";
        private const string STR_CHOICE_E = "CHỌN DÒNG CẦN SỬA\n\r HOẶC KHÔNG ĐƯỢC CHỌN NHÓM ĐỂ SỬA";
        #endregion

        private void frmNhomchucnang_Load(object sender, EventArgs e)
        {
            LoadData();
            ClearDataBindings();
            DataBindingControl();
            ReadOnlyControl(true);
            ChangeStatus(true);
        }

        private void txtName_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode.ToString() == "Return")
            {
                _state = State.Add;
                PerformSave();
            }
        }

        private void txtNote_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode.ToString() == "Return")
            {
                if (_state == State.Edit)
                {

                }
                else _state = State.Add;
                PerformSave();
            }
        }
    }
}

